# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/11 10:41 
@Author  : ZhangShenao 
@File    : 1.使用with_retry实现重试策略.py
@Desc    : 使用with_retry()函数,可以实现Runnable的重试机制
"""
import datetime

from langchain_core.runnables import RunnableLambda

count = -1


def process(x: int) -> float:
    """模拟执行异常函数"""

    global count
    print(f'execute time: {datetime.datetime.now()}, count: {count}')
    count += 1
    return x / count


# 创建一个新的具有重试功能的RunnableRetry
chain = RunnableLambda(process).with_retry(
    wait_exponential_jitter=True,  # 开启重试间隔的指数退避策略,每次重试间隔以2的指数增加,并且增加1s内的随机时间
    stop_after_attempt=3  # 设置最大重试次数
)

result = chain.invoke(1)
print(result)
